template <class C> inline bool is_corner_9(const unsigned char* p, const int w, const short barrier)
{
   const int w3 = 3*w;
   const short t = C::prep_t(*p, barrier);
   if (!C::eval(p[-1-w3],t)) { // ???????????????-
      if (!C::eval(p[w3],t)) { // ????????-??????-
         return false;
      } // ????????@??????-
      if (!C::eval(p[1+w3],t)) { // ???????-@??????-
         return false;
      } // ???????@@??????-
      if (!C::eval(p[2+2*w],t)) { // ??????-@@??????-
         return false;
      } // ??????@@@??????-
      if (!C::eval(p[3+w],t)) { // ?????-@@@??????-
         if (!C::eval(p[-2-2*w],t)) { // ?????-@@@?????--
            return false;
         } // ?????-@@@?????@-
         if (!C::eval(p[-3-w],t)) { // ?????-@@@????-@-
            return false;
         } // ?????-@@@????@@-
         if (!C::eval(p[-1+w3],t)) { // ?????-@@@-???@@-
            return false;
         } // ?????-@@@@???@@-
         if (!C::eval(p[-2+2*w],t)) { // ?????-@@@@-??@@-
            return false;
         } // ?????-@@@@@??@@-
         if (!C::eval(p[-3+w],t)) { // ?????-@@@@@-?@@-
            return false;
         } // ?????-@@@@@@?@@-
         if (!C::eval(p[-3],t)) { // ?????-@@@@@@-@@-
            return false;
         } // ?????-@@@@@@@@@-
         return true;
      } // ?????@@@@??????-
      if (!C::eval(p[3],t)) { // ????-@@@@??????-
         if (!C::eval(p[-3-w],t)) { // ????-@@@@????-?-
            return false;
         } // ????-@@@@????@?-
         if (!C::eval(p[-1+w3],t)) { // ????-@@@@-???@?-
            return false;
         } // ????-@@@@@???@?-
         if (!C::eval(p[-2+2*w],t)) { // ????-@@@@@-??@?-
            return false;
         } // ????-@@@@@@??@?-
         if (!C::eval(p[-3+w],t)) { // ????-@@@@@@-?@?-
            return false;
         } // ????-@@@@@@@?@?-
         if (!C::eval(p[-3],t)) { // ????-@@@@@@@-@?-
            return false;
         } // ????-@@@@@@@@@?-
         return true;
      } // ????@@@@@??????-
      if (!C::eval(p[3-w],t)) { // ???-@@@@@??????-
         if (!C::eval(p[-1+w3],t)) { // ???-@@@@@-?????-
            return false;
         } // ???-@@@@@@?????-
         if (!C::eval(p[-2+2*w],t)) { // ???-@@@@@@-????-
            return false;
         } // ???-@@@@@@@????-
         if (!C::eval(p[-3+w],t)) { // ???-@@@@@@@-???-
            return false;
         } // ???-@@@@@@@@???-
         if (!C::eval(p[-3],t)) { // ???-@@@@@@@@-??-
            return false;
         } // ???-@@@@@@@@@??-
         return true;
      } // ???@@@@@@??????-
      if (!C::eval(p[-1+w3],t)) { // ???@@@@@@-?????-
         if (!C::eval(p[-w3],t)) { // -??@@@@@@-?????-
            return false;
         } // @??@@@@@@-?????-
         if (!C::eval(p[1-w3],t)) { // @-?@@@@@@-?????-
            return false;
         } // @@?@@@@@@-?????-
         if (!C::eval(p[2-2*w],t)) { // @@-@@@@@@-?????-
            return false;
         } // @@@@@@@@@-?????-
         return true;
      } // ???@@@@@@@?????-
      if (!C::eval(p[2-2*w],t)) { // ??-@@@@@@@?????-
         if (!C::eval(p[-2+2*w],t)) { // ??-@@@@@@@-????-
            return false;
         } // ??-@@@@@@@@????-
         if (!C::eval(p[-3+w],t)) { // ??-@@@@@@@@-???-
            return false;
         } // ??-@@@@@@@@@???-
         return true;
      } // ??@@@@@@@@?????-
      if (!C::eval(p[-2+2*w],t)) { // ??@@@@@@@@-????-
         if (!C::eval(p[1-w3],t)) { // ?-@@@@@@@@-????-
            return false;
         } // ?@@@@@@@@@-????-
         return true;
      } // ??@@@@@@@@@????-
      return true;
   } // ???????????????@
   if (!C::eval(p[-2-2*w],t)) { // ??????????????-@
      if (!C::eval(p[3+w],t)) { // ?????-????????-@
         return false;
      } // ?????@????????-@
      if (!C::eval(p[1+w3],t)) { // ?????@?-??????-@
         return false;
      } // ?????@?@??????-@
      if (!C::eval(p[2+2*w],t)) { // ?????@-@??????-@
         return false;
      } // ?????@@@??????-@
      if (!C::eval(p[3],t)) { // ????-@@@??????-@
         if (!C::eval(p[-3-w],t)) { // ????-@@@?????--@
            return false;
         } // ????-@@@?????@-@
         if (!C::eval(p[-3],t)) { // ????-@@@????-@-@
            return false;
         } // ????-@@@????@@-@
         if (!C::eval(p[w3],t)) { // ????-@@@-???@@-@
            return false;
         } // ????-@@@@???@@-@
         if (!C::eval(p[-1+w3],t)) { // ????-@@@@-??@@-@
            return false;
         } // ????-@@@@@??@@-@
         if (!C::eval(p[-2+2*w],t)) { // ????-@@@@@-?@@-@
            return false;
         } // ????-@@@@@@?@@-@
         if (!C::eval(p[-3+w],t)) { // ????-@@@@@@-@@-@
            return false;
         } // ????-@@@@@@@@@-@
         return true;
      } // ????@@@@??????-@
      if (!C::eval(p[3-w],t)) { // ???-@@@@??????-@
         if (!C::eval(p[-3],t)) { // ???-@@@@????-?-@
            return false;
         } // ???-@@@@????@?-@
         if (!C::eval(p[w3],t)) { // ???-@@@@-???@?-@
            return false;
         } // ???-@@@@@???@?-@
         if (!C::eval(p[-1+w3],t)) { // ???-@@@@@-??@?-@
            return false;
         } // ???-@@@@@@??@?-@
         if (!C::eval(p[-2+2*w],t)) { // ???-@@@@@@-?@?-@
            return false;
         } // ???-@@@@@@@?@?-@
         if (!C::eval(p[-3+w],t)) { // ???-@@@@@@@-@?-@
            return false;
         } // ???-@@@@@@@@@?-@
         return true;
      } // ???@@@@@??????-@
      if (!C::eval(p[2-2*w],t)) { // ??-@@@@@??????-@
         if (!C::eval(p[w3],t)) { // ??-@@@@@-?????-@
            return false;
         } // ??-@@@@@@?????-@
         if (!C::eval(p[-1+w3],t)) { // ??-@@@@@@-????-@
            return false;
         } // ??-@@@@@@@????-@
         if (!C::eval(p[-2+2*w],t)) { // ??-@@@@@@@-???-@
            return false;
         } // ??-@@@@@@@@???-@
         if (!C::eval(p[-3+w],t)) { // ??-@@@@@@@@-??-@
            return false;
         } // ??-@@@@@@@@@??-@
         return true;
      } // ??@@@@@@??????-@
      if (!C::eval(p[1-w3],t)) { // ?-@@@@@@??????-@
         if (!C::eval(p[w3],t)) { // ?-@@@@@@-?????-@
            return false;
         } // ?-@@@@@@@?????-@
         if (!C::eval(p[-1+w3],t)) { // ?-@@@@@@@-????-@
            return false;
         } // ?-@@@@@@@@????-@
         if (!C::eval(p[-2+2*w],t)) { // ?-@@@@@@@@-???-@
            return false;
         } // ?-@@@@@@@@@???-@
         return true;
      } // ?@@@@@@@??????-@
      if (!C::eval(p[-w3],t)) { // -@@@@@@@??????-@
         if (!C::eval(p[w3],t)) { // -@@@@@@@-?????-@
            return false;
         } // -@@@@@@@@?????-@
         if (!C::eval(p[-1+w3],t)) { // -@@@@@@@@-????-@
            return false;
         } // -@@@@@@@@@????-@
         return true;
      } // @@@@@@@@??????-@
      return true;
   } // ??????????????@@
   if (!C::eval(p[-w3],t)) { // -?????????????@@
      if (!C::eval(p[1+w3],t)) { // -??????-??????@@
         return false;
      } // -??????@??????@@
      if (!C::eval(p[-1+w3],t)) { // -??????@?-????@@
         return false;
      } // -??????@?@????@@
      if (!C::eval(p[w3],t)) { // -??????@-@????@@
         return false;
      } // -??????@@@????@@
      if (!C::eval(p[-2+2*w],t)) { // -??????@@@-???@@
         if (!C::eval(p[2+2*w],t)) { // -?????-@@@-???@@
            return false;
         } // -?????@@@@-???@@
         if (!C::eval(p[3+w],t)) { // -????-@@@@-???@@
            return false;
         } // -????@@@@@-???@@
         if (!C::eval(p[1-w3],t)) { // --???@@@@@-???@@
            return false;
         } // -@???@@@@@-???@@
         if (!C::eval(p[2-2*w],t)) { // -@-??@@@@@-???@@
            return false;
         } // -@@??@@@@@-???@@
         if (!C::eval(p[3-w],t)) { // -@@-?@@@@@-???@@
            return false;
         } // -@@@?@@@@@-???@@
         if (!C::eval(p[3],t)) { // -@@@-@@@@@-???@@
            return false;
         } // -@@@@@@@@@-???@@
         return true;
      } // -??????@@@@???@@
      if (!C::eval(p[-3+w],t)) { // -??????@@@@-??@@
         if (!C::eval(p[2+2*w],t)) { // -?????-@@@@-??@@
            return false;
         } // -?????@@@@@-??@@
         if (!C::eval(p[2-2*w],t)) { // -?-???@@@@@-??@@
            return false;
         } // -?@???@@@@@-??@@
         if (!C::eval(p[3-w],t)) { // -?@-??@@@@@-??@@
            return false;
         } // -?@@??@@@@@-??@@
         if (!C::eval(p[3],t)) { // -?@@-?@@@@@-??@@
            return false;
         } // -?@@@?@@@@@-??@@
         if (!C::eval(p[3+w],t)) { // -?@@@-@@@@@-??@@
            return false;
         } // -?@@@@@@@@@-??@@
         return true;
      } // -??????@@@@@??@@
      if (!C::eval(p[-3],t)) { // -??????@@@@@-?@@
         if (!C::eval(p[3-w],t)) { // -??-???@@@@@-?@@
            return false;
         } // -??@???@@@@@-?@@
         if (!C::eval(p[3],t)) { // -??@-??@@@@@-?@@
            return false;
         } // -??@@??@@@@@-?@@
         if (!C::eval(p[3+w],t)) { // -??@@-?@@@@@-?@@
            return false;
         } // -??@@@?@@@@@-?@@
         if (!C::eval(p[2+2*w],t)) { // -??@@@-@@@@@-?@@
            return false;
         } // -??@@@@@@@@@-?@@
         return true;
      } // -??????@@@@@@?@@
      if (!C::eval(p[-3-w],t)) { // -??????@@@@@@-@@
         if (!C::eval(p[3],t)) { // -???-??@@@@@@-@@
            return false;
         } // -???@??@@@@@@-@@
         if (!C::eval(p[3+w],t)) { // -???@-?@@@@@@-@@
            return false;
         } // -???@@?@@@@@@-@@
         if (!C::eval(p[2+2*w],t)) { // -???@@-@@@@@@-@@
            return false;
         } // -???@@@@@@@@@-@@
         return true;
      } // -??????@@@@@@@@@
      return true;
   } // @?????????????@@
   if (!C::eval(p[-3-w],t)) { // @????????????-@@
      if (!C::eval(p[2+2*w],t)) { // @?????-??????-@@
         return false;
      } // @?????@??????-@@
      if (!C::eval(p[3+w],t)) { // @????-@??????-@@
         return false;
      } // @????@@??????-@@
      if (!C::eval(p[3],t)) { // @???-@@??????-@@
         return false;
      } // @???@@@??????-@@
      if (!C::eval(p[3-w],t)) { // @??-@@@??????-@@
         if (!C::eval(p[-3],t)) { // @??-@@@?????--@@
            return false;
         } // @??-@@@?????@-@@
         if (!C::eval(p[-3+w],t)) { // @??-@@@????-@-@@
            return false;
         } // @??-@@@????@@-@@
         if (!C::eval(p[1+w3],t)) { // @??-@@@-???@@-@@
            return false;
         } // @??-@@@@???@@-@@
         if (!C::eval(p[w3],t)) { // @??-@@@@-??@@-@@
            return false;
         } // @??-@@@@@??@@-@@
         if (!C::eval(p[-1+w3],t)) { // @??-@@@@@-?@@-@@
            return false;
         } // @??-@@@@@@?@@-@@
         if (!C::eval(p[-2+2*w],t)) { // @??-@@@@@@-@@-@@
            return false;
         } // @??-@@@@@@@@@-@@
         return true;
      } // @??@@@@??????-@@
      if (!C::eval(p[2-2*w],t)) { // @?-@@@@??????-@@
         if (!C::eval(p[-3+w],t)) { // @?-@@@@????-?-@@
            return false;
         } // @?-@@@@????@?-@@
         if (!C::eval(p[1+w3],t)) { // @?-@@@@-???@?-@@
            return false;
         } // @?-@@@@@???@?-@@
         if (!C::eval(p[w3],t)) { // @?-@@@@@-??@?-@@
            return false;
         } // @?-@@@@@@??@?-@@
         if (!C::eval(p[-1+w3],t)) { // @?-@@@@@@-?@?-@@
            return false;
         } // @?-@@@@@@@?@?-@@
         if (!C::eval(p[-2+2*w],t)) { // @?-@@@@@@@-@?-@@
            return false;
         } // @?-@@@@@@@@@?-@@
         return true;
      } // @?@@@@@??????-@@
      if (!C::eval(p[1-w3],t)) { // @-@@@@@??????-@@
         if (!C::eval(p[1+w3],t)) { // @-@@@@@-?????-@@
            return false;
         } // @-@@@@@@?????-@@
         if (!C::eval(p[w3],t)) { // @-@@@@@@-????-@@
            return false;
         } // @-@@@@@@@????-@@
         if (!C::eval(p[-1+w3],t)) { // @-@@@@@@@-???-@@
            return false;
         } // @-@@@@@@@@???-@@
         if (!C::eval(p[-2+2*w],t)) { // @-@@@@@@@@-??-@@
            return false;
         } // @-@@@@@@@@@??-@@
         return true;
      } // @@@@@@@??????-@@
      return true;
   } // @????????????@@@
   if (!C::eval(p[1-w3],t)) { // @-???????????@@@
      if (!C::eval(p[-2+2*w],t)) { // @-????????-??@@@
         return false;
      } // @-????????@??@@@
      if (!C::eval(p[-1+w3],t)) { // @-???????-@??@@@
         return false;
      } // @-???????@@??@@@
      if (!C::eval(p[w3],t)) { // @-??????-@@??@@@
         return false;
      } // @-??????@@@??@@@
      if (!C::eval(p[-3+w],t)) { // @-??????@@@-?@@@
         if (!C::eval(p[1+w3],t)) { // @-?????-@@@-?@@@
            return false;
         } // @-?????@@@@-?@@@
         if (!C::eval(p[2+2*w],t)) { // @-????-@@@@-?@@@
            return false;
         } // @-????@@@@@-?@@@
         if (!C::eval(p[2-2*w],t)) { // @--???@@@@@-?@@@
            return false;
         } // @-@???@@@@@-?@@@
         if (!C::eval(p[3-w],t)) { // @-@-??@@@@@-?@@@
            return false;
         } // @-@@??@@@@@-?@@@
         if (!C::eval(p[3],t)) { // @-@@-?@@@@@-?@@@
            return false;
         } // @-@@@?@@@@@-?@@@
         if (!C::eval(p[3+w],t)) { // @-@@@-@@@@@-?@@@
            return false;
         } // @-@@@@@@@@@-?@@@
         return true;
      } // @-??????@@@@?@@@
      if (!C::eval(p[-3],t)) { // @-??????@@@@-@@@
         if (!C::eval(p[1+w3],t)) { // @-?????-@@@@-@@@
            return false;
         } // @-?????@@@@@-@@@
         if (!C::eval(p[3-w],t)) { // @-?-???@@@@@-@@@
            return false;
         } // @-?@???@@@@@-@@@
         if (!C::eval(p[3],t)) { // @-?@-??@@@@@-@@@
            return false;
         } // @-?@@??@@@@@-@@@
         if (!C::eval(p[3+w],t)) { // @-?@@-?@@@@@-@@@
            return false;
         } // @-?@@@?@@@@@-@@@
         if (!C::eval(p[2+2*w],t)) { // @-?@@@-@@@@@-@@@
            return false;
         } // @-?@@@@@@@@@-@@@
         return true;
      } // @-??????@@@@@@@@
      return true;
   } // @@???????????@@@
   if (!C::eval(p[-3],t)) { // @@??????????-@@@
      if (!C::eval(p[3+w],t)) { // @@???-??????-@@@
         return false;
      } // @@???@??????-@@@
      if (!C::eval(p[3],t)) { // @@??-@??????-@@@
         return false;
      } // @@??@@??????-@@@
      if (!C::eval(p[3-w],t)) { // @@?-@@??????-@@@
         return false;
      } // @@?@@@??????-@@@
      if (!C::eval(p[2-2*w],t)) { // @@-@@@??????-@@@
         if (!C::eval(p[-3+w],t)) { // @@-@@@?????--@@@
            return false;
         } // @@-@@@?????@-@@@
         if (!C::eval(p[-2+2*w],t)) { // @@-@@@????-@-@@@
            return false;
         } // @@-@@@????@@-@@@
         if (!C::eval(p[2+2*w],t)) { // @@-@@@-???@@-@@@
            return false;
         } // @@-@@@@???@@-@@@
         if (!C::eval(p[1+w3],t)) { // @@-@@@@-??@@-@@@
            return false;
         } // @@-@@@@@??@@-@@@
         if (!C::eval(p[w3],t)) { // @@-@@@@@-?@@-@@@
            return false;
         } // @@-@@@@@@?@@-@@@
         if (!C::eval(p[-1+w3],t)) { // @@-@@@@@@-@@-@@@
            return false;
         } // @@-@@@@@@@@@-@@@
         return true;
      } // @@@@@@??????-@@@
      return true;
   } // @@??????????@@@@
   if (!C::eval(p[2-2*w],t)) { // @@-?????????@@@@
      if (!C::eval(p[-1+w3],t)) { // @@-??????-??@@@@
         return false;
      } // @@-??????@??@@@@
      if (!C::eval(p[-2+2*w],t)) { // @@-??????@-?@@@@
         return false;
      } // @@-??????@@?@@@@
      if (!C::eval(p[-3+w],t)) { // @@-??????@@-@@@@
         return false;
      } // @@-??????@@@@@@@
      return true;
   } // @@@?????????@@@@
   if (!C::eval(p[-3+w],t)) { // @@@????????-@@@@
      if (!C::eval(p[3-w],t)) { // @@@-???????-@@@@
         return false;
      } // @@@@???????-@@@@
      if (!C::eval(p[3],t)) { // @@@@-??????-@@@@
         return false;
      } // @@@@@??????-@@@@
      return true;
   } // @@@????????@@@@@
   if (!C::eval(p[3-w],t)) { // @@@-???????@@@@@
      if (!C::eval(p[-2+2*w],t)) { // @@@-??????-@@@@@
         return false;
      } // @@@-??????@@@@@@
      return true;
   } // @@@@???????@@@@@
   return true;
}
